def print_info(name, age, gender):
    print("name:", name)
    print("age: ", age)
    print("gender: ", gender)


# 注意：定义带有默认值参数的函数，必修将默认值形参放到函数的其他函数的后面
def print_nation(name, age, gender, nation="汉族"):
    print("name:", name)
    print("age: ", age)
    print("gender: ", gender)
    print("nation: ", nation)


# 首先确定代码中有没有位置参数
# 有位置参数：位置参数一定要放到可变参数的前面
def print_var_parameters(*args):
    # 在调用的时候，可变参数会转换为一个元组。
    # 可以使用索引访问每一个元素
    print(args)

    for index in range(0, len(args)):
        print(args[index])


# 可变关键词参数
# 有位置参数：位置参数一定要放到可变参数的前面
def print_var_kw_parameters(**kwargs):
    print(kwargs)
    for key in kwargs.keys():
        print(key, ": ", kwargs[key])


# 组合参数的顺序：位置参数、可变参数、可变关键词参数
def print_pm(param, nation="汉族", *args, **kwargs):
    print("param: ", param)
    print("nation: ", nation)

    for index in range(0, len(args)):
        print(args[index])

    for key in kwargs.keys():
        print(key, ": ", kwargs[key])


if __name__ == '__main__':
    name = "abc"
    age = 18
    gender = "M"
    # 位置参数, 按照函数的定义参数的顺序调用函数
    print_info(name, age, gender)

    # 关键词参数，出现在 函数调用过程中。
    # 使用过程中，通过 key = value 的进行将实参进行传递
    print_info(name=name, age=age, gender=gender)
    print_info(age=age, gender=gender, name=name)
    print_info(gender=gender, name=name, age=age)

    print_nation(name, age, gender, "满族")
    print_nation(name, age, gender)

    print_var_parameters(name, age, gender)

    # Python 语言不能简写，不是 Javascript。
    print_var_kw_parameters(name=name, age=age, gener=gender)

    print_pm(name, nation="壮族", grade="软件")
